package cn.tdeu.v4;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

/**
 * 多线程并发安全问题：
 * 当多个线程并发操作同一个资源时候，由于线程切换时机不确定
 * 可能会导致代码执行混乱，而且还有可能
 *
 * 客户端  多线程并发 X    服务器 多线程并发  √
 *
 * synchronized  关键字  ---多线程并发  同步锁
 *
 * 使用方式①：同步块方式   最常用，同步；控制线程执行顺序，避免线程之间冲突
 *        ②：同步方法  一个线程执行完毕之后，在执行下一个
 * 定义语法：
 *     synchronized(同步监视器对象){
 *         需要同步运行的代码块：
 *     }
 *  案例：去厕所  问题
 */
public class Thread_syn {
    public static void main(String[] args) {
      //创建厕所类--
        WC wc=new WC();
      //创建第一个人--线程
      Thread p1=new Thread(()->{
         wc.door();
      });
        Thread p2=new Thread(()->{
            wc.door();
      });
      p1.start();
      p2.start();
    }
}
//创建厕所类
class WC{
   public void door(){
       //线程实例--记录线程信息
       Thread s=Thread.currentThread();
       System.out.println(s.getName()+"去厕所。。。");
       try {
           synchronized (this) {
               //同步锁：门加一把锁
               //线程执行 同步锁，每次只放行一个线程
               Thread.sleep(5000);
               System.out.println(s.getName() + "找门进去QAQ");

               Thread.sleep(3000);
           }
           System.out.println(s.getName()+"穿裤子走人OVO");
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
   }
}
